package cn.rocky.zuosheng;

import java.util.Stack;

/**
 * 题目:
 * 编写一个类,用两个栈实现队列, 支持队列的基本操作(add、poll、peek)
 * 解答:
 * 栈的特点是先进后出, 而队列的特点是先进先出。
 * 我们使用两个栈正好能把顺序反过来实现类似队列的操作。
 * 步骤:
 * 1. 如果stackPush 要往 stackPop 中压入数据, 那么必须一次性把 stackPush中的数据全部压入。
 * 2. 如果stackPop 不为空, stackPush 绝对不能向 stackPop 中压入数据。
 */
public class TwoStacksQueue {

    public Stack<Integer> stackPush;
    public Stack<Integer> stackPop;

    public TwoStacksQueue() {
        this.stackPush = new Stack<>();
        this.stackPop = new Stack<>();
    }

    public void add(int pushInt) {
        stackPush.push(pushInt);
    }

    public int poll() {
        if (stackPop.empty() && stackPush.empty()) {
            throw new RuntimeException("Queue is empty");
        } else if (stackPop.empty()) {
            while (!stackPush.empty()) {
                stackPop.push(stackPush.pop());
            }
        }
        return stackPop.pop();
    }

    public int peek() {
        if (stackPop.empty() && stackPush.empty()) {
            throw new RuntimeException("Queue is empty");
        } else if (stackPop.empty()) {
            while (!stackPush.empty()) {
                stackPop.push(stackPush.pop());
            }
        }
        return stackPop.peek();
    }

}
